/**
  ******************************************************************************
  * @file    main.c
  * @author  AE Team
  * @version 1.0.3
  * @date    2024-05-28
  * @brief   本样例演示 ATIM 的 ETR 计数功能
  *          通过 MCO(PA04) 输出 LSI 时钟信号，ATIM 对输入到 ETR(PA02) 管脚的脉冲信号进行计数
  *          需使用杜邦线连接 MCO(PA04) 与 ATIM.ETR(PA02)
  *          使用示波器观察 MCO(PA04) 和 ATIM.CH3(PA03) 的波形
  *
  * @note    硬件平台：SYM32L010_StartKit_V1.0
  *          接线说明：断开J21、J13、J27
  *
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2024 SIYIMicro.
  * All rights reserved.</center></h2>
  *
  *
  ******************************************************************************
  */


/******************************************************************************/
/* Include files                                                              */
/******************************************************************************/
#include "main.h"
#include "sym32l010_hal_sysctrl.h"
#include "sym32l010_hal_systick.h"
#include "sym32l010_hal_gpio.h"
#include "sym32l010_hal_atim.h"
#include "sym32l010_Startkit_board.h"


/******************************************************************************/
/* Local pre-processor symbols/macros ('#define')                             */
/******************************************************************************/

/******************************************************************************/
/* Global variable definitions (declared in header file with 'extern')        */
/******************************************************************************/
ATIM_HandleTypeDef hatim;

/******************************************************************************/
/* Local type definitions ('typedef')                                         */
/******************************************************************************/

/******************************************************************************/
/* Local function prototypes ('static')                                       */
/******************************************************************************/
static void ATIM_Init(void);

/******************************************************************************/
/* Local variable definitions ('static')                                      */
/******************************************************************************/

/******************************************************************************/
/* Local pre-processor symbols/macros ('#define')                             */
/******************************************************************************/

/******************************************************************************/
/* Function implementation - global ('extern') and local ('static')           */
/******************************************************************************/


/*******************************************************************************
 ** \brief  Main function of project
 **
 ** \return uint32_t return value, if needed
 **
 **
 ******************************************************************************/
int32_t main(void)
{
    // 初始化系统时钟
    HAL_SysCtrl_ConfigWaitCycle(48000000);
    HAL_SysCtrl_HSI_SetDiv(HSIOSC_TO_HSI48MHZ);

    // 初始化LSI并从MCO输出
    HAL_SysCtrl_LSI_Enable();
    HAL_SysCtrl_ClkOut_MCO_PA04(SYSCTRL_MCO_SRC_LSI, SYSCTRL_MCO_DIV1);

    // 初始化ATIM
    ATIM_Init();

    // 请使用杜邦线连接 MCO(PA04) 与 ATIM.ETR(PA02)
    // 请用示波器观察   MCO(PA04) 与 ATIM.CH3(PA03)的频率，ATIM_CH3的频率应该是MCO频率的十分之一
    while (1)
    {
        ;
    }
}


/*******************************************************************************
 * @brief  ATIM初始化
 * @param  None
 * @retval None
 */
static void ATIM_Init(void)
{
    GPIO_InitTypeDef             GPIO_InitStruct;
    ATIM_SlaveConfigTypeDef      ATIM_SlaveCfgStruct;
    MemClr(&GPIO_InitStruct,     sizeof(GPIO_InitStruct));
    MemClr(&ATIM_SlaveCfgStruct, sizeof(ATIM_SlaveCfgStruct));

    HAL_SYSCTRL_GPIOA_CLK_ENABLE();
    HAL_SYSCTRL_ATIM_CLK_ENABLE();

    //------------------------------------------------------------
    // 配置PA03端口为ATIM_CH3输出
    AFx_ATIMCH3_PA03();
    GPIO_InitStruct.Pins = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(SYM_GPIOA, &GPIO_InitStruct);

    // 配置PA02端口为ATIM_ETR输入
    AFx_ATIMETR_PA02();
    GPIO_InitStruct.Pins = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULL_UP;
    HAL_GPIO_Init(SYM_GPIOA, &GPIO_InitStruct);

    //------------------------------------------------------------
    MemClr(&hatim, sizeof(hatim));

    // ATIM时基初始化
    hatim.Instance               = SYM_ATIM;
    hatim.Init.ClockDivision     = ATIM_CLOCKDIVISION_DIV1;
    hatim.Init.CounterMode       = ATIM_COUNTERMODE_UP;
    hatim.Init.Prescaler         = 1 - 1;
    hatim.Init.Period            = 10 - 1;                            // 溢出频率为ETR的十分之一
    hatim.Init.RepetitionCounter = 0;
    hatim.Init.AutoReloadPreload = ATIM_AUTORELOAD_PRELOAD_DISABLE;
    HAL_ATIM_Base_Init(&hatim);

    // ATIM输出比较通道初始化
    hatim.OcInit.OCMode       = ATIM_OCMODE_PWM2;
    hatim.OcInit.Pulse        = 10 - 1;
    hatim.OcInit.OCPolarity   = ATIM_OCPOLARITY_HIGH;
    hatim.OcInit.OCFastMode   = ATIM_OCFAST_DISABLE;
    HAL_ATIM_OC_ConfigChannel(&hatim, &hatim.OcInit, ATIM_CHANNEL_3);

    // ATIM 从模式配置
    ATIM_SlaveCfgStruct.SlaveMode        = ATIM_SLAVEMODE_EXTERNAL1;  // 外部时钟模式1，计数单元的计数时钟为TRGI
    ATIM_SlaveCfgStruct.InputTrigger     = ATIM_TS_ETRF;              // 触发信号来源设置为ETRF
    ATIM_SlaveCfgStruct.TriggerFilter    = 2;                         // 滤波fSAMPLING=fDTS/1， N=4
    ATIM_SlaveCfgStruct.TriggerPolarity  = ATIM_TRIGGERPOLARITY_NONINVERTED;
    ATIM_SlaveCfgStruct.TriggerPrescaler = ATIM_TRIGGERPRESCALER_DIV1; // 不分频
    HAL_ATIM_SlaveConfigSynchro(&hatim, &ATIM_SlaveCfgStruct);

    // 启动ATIM的CH3输出
    HAL_ATIM_OC_Start(&hatim, ATIM_CHANNEL_3);
}


/*******************************************************************************
 ** EOF (not truncated)
 ******************************************************************************/
#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
    /* USER CODE BEGIN */
    /* User can add his own implementation to report the file name and line number,
       tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    /* USER CODE END */
}
#endif /* USE_FULL_ASSERT */


/************************ (C) COPYRIGHT SIYIMicro *****END OF FILE*************/
